package model;

import java.util.ArrayList;
import java.util.Collections;

/*
 
 * 
 * Attributs : pileCarte qui est une liste de carte et indice qui se met toujours à la fin de la pile
 * 
 * Fonctions : empiler(Carte c) : qui met rajoute une carte à la pile
 *             depiler() : qui enlève la dérniére carte de la pile et qui la retourne
 *             taille() : retourne la taille de la pile
 *             estVide() : renvoie true si la pile est vide
 *             contains(Carte c) : renvoie true si la carte est dans la pile
 *             déplacerCarte(Carte c,Pile p) : empile c à p et enlève c de la pile
 *             melanger() : mélange la pile 
 * 
 */
/**
 *
 * Classe qui représente le deck et la corbeille. Elle contient une liste de Carte et un indice qui permettra de savoir où se situe chaque carte.
 *
 * @author Antoine Thorr, Joana Santos, Samy Rida, Vicky Ngo Pagbe
 */
public class Pile {

    private ArrayList<Carte> pileCarte;
    private int indice;

    /**
     * Constructeur de la classe Pile. Créer une liste de Carte et un indice
     * affecté à 0.
     */
    public Pile() {
        this.pileCarte = new ArrayList<>();
        this.indice = 0;
    }

    /**
     * Constructeur de la classe Pile qui prend en paramètre une lsite de Carte.
     *
     * @param pileCarte
     */
    public Pile(ArrayList<Carte> pileCarte) {
        this.pileCarte = pileCarte;
        this.indice = this.taille() - 1;
    }

    /**
     * Rajoute une carte à la fin de la pile de carte.
     *
     * @param c Carte à ajouter à la pile.
     */
    public void empiler(Carte c) {
        this.pileCarte.add(indice, c);
        indice = this.taille() - 1;
    }

    /**
     * Enlève la dérnière carte de la pile et qui la retourne
     *
     * @return
     */
    public Carte depiler() {
        Carte c = this.getCarte(indice);
        this.pileCarte.remove(c);
        this.indice--;
        return c;
    }

    /**
     * Retourne la taille de la Pile
     *
     * @return taille de la Pile
     */
    public int taille() {
        return this.pileCarte.size();
    }

    /**
     * Retourne sur la Pile est vide
     *
     * @return True si la Pile est vide, false sinon
     */
    public boolean estVide() {
        return this.pileCarte.isEmpty();
    }

    /**
     * Retourne si la Pile contient la carte passé en paramètre
     *
     * @param c Carte recherchée
     * @return True si la carte est présente, faux sinon.
     */
    public boolean contains(Carte c) {
        return this.pileCarte.contains(c);
    }

    /**
     * Retourne la Carte présente à l'indice passé en paramètre.
     *
     * @param indice
     * @return La carte présente à l'indice.
     */
    public Carte getCarte(int indice) {
        return this.pileCarte.get(indice);
    }

    /**
     * Retourne la liste de Cartes présentes dans la Pile
     *
     * @return ArrayList de Carte
     */
    public ArrayList<Carte> getPileCarte() {
        return this.pileCarte;
    }

    /**
     * Retourne l'indice
     *
     * @return l'indice
     */
    public int getIndice() {
        return this.indice;
    }

    /**
     * Permet de modifier l'indice
     *
     * @param indice nouvelle indice
     */
    public void setIndice(int indice) {
        this.indice = indice;
    }

    /**
     * Permet de déplacer une Carte passé en paramètre vers une autre Pile.
     * Rajoute une Carte c à la fin de la Pile p, puis enlève la pile c de la
     * Pile courante.
     *
     * @param c Carte à déplacer.
     * @param p Pile dans laquelle on doit placer la Carte.
     */
    public void deplacerCarte(Carte c, Pile p) {
        p.empiler(c);
        this.pileCarte.remove(c);
        this.indice = this.taille() - 1;
    }

    /**
     * Permet de mélanger les cartes présentes dans la Pile.
     */
    public void melanger() {
        Collections.shuffle(pileCarte);
    }

    /**
     * Redéfinition de la méthode toString
     *
     * @return l'affichage de la Pile
     */
    @Override
    public String toString() {
        StringBuilder str = new StringBuilder();
        str.append(this.taille());
        return str.toString();
    }
}
